package bfw3b9.atprin.Interface;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import android.content.Context;
import android.util.Log;

/**
 * Ein Item das im Menue angezeigt werden Kann
 * Z.B. Tower, oder Towerupgrades
 * 
 * @author Thomas Rinsch
 *
 */
public class InterfaceItem extends Point 
{
	private final String LOGTAG = "InterfaceItem";
	private FloatBuffer mMeshBuffer;
	private final int BYTESPERFLOAT = Float.SIZE/Byte.SIZE;
	private final int VERTEXSIZE = 3;	// 3 Punkte pro Vertex	(X, Y, Z)
	private final int TEXCOORDSIZE = 2;	// 2 Punkte pro Texturkoordinate	(S, T)
	private final int BLOCKSIZE = (VERTEXSIZE+TEXCOORDSIZE)*BYTESPERFLOAT;
	private final int VERTEXCOUNT;
	private final int mID;
	private int mBufferID;
	private int mTexture;
	private int mTextureGL;	// Die Texturreferenz in OpenGL
	private String mName;

	/**
	 * Konstruktor
	 * @param _x X-Position
	 * @param _y Y-Position
	 * @param _texture Textur-ID
	 * @param _name Itemname
	 */
	public InterfaceItem(int _x, int _y, int _id, int _texture, String _name) {
		super(_x, _y);
		Log.d(LOGTAG,"Konstruktor aufgerufen");

		mTexture = _texture;
		mName = _name;

		/* Polygone und Texturkoordinaten in einem Array (Packed Buffer)
		 * Aufbau: X, Y, Z, S, T (S und T sind die X- und Y Texturkoordinaten)
		 */
		final float[] meshData = {
				-1.0f, 1.0f, -1.0f, 0.0f, 0.0f,
				-1.0f, -1.0f, -1.0f, 0.0f, 1.0f,
				1.0f, 1.0f, -1.0f, 1.0f, 0.0f,
				-1.0f, -1.0f, -1.0f, 0.0f, 1.0f,
				1.0f, -1.0f, -1.0f, 1.0f, 1.0f,
				1.0f, 1.0f, -1.0f, 1.0f, 0.0f
		};


		// Meshdaten in den Buffer schreiben
		mMeshBuffer = ByteBuffer.allocateDirect(meshData.length * BYTESPERFLOAT)
				.order(ByteOrder.nativeOrder()).asFloatBuffer();							
		mMeshBuffer.put(meshData).position(0);

		VERTEXCOUNT = meshData.length/5;
		mID = _id;
		
		Log.d(LOGTAG,"Konstruktor erfolgreich");
	}

	/**
	 * Gibt die ID der Textur im OpenGL System zurueck
	 * @return
	 */
	public int getTexture()
	{
		return mTextureGL;
	}

	/**
	 * Gibt den Itemnamen zurueck
	 * @return
	 */
	public String getName()
	{
		return mName;
	}

	/**
	 * Laedt die Textur in das OpenGL System
	 * @param _context
	 */
	public void loadTextureData(Context _context)
	{
		mTextureGL = InterfaceRenderer.loadTexture(_context, mTexture);
	}


	/**
	 * Gibt die Meshdaten zurueck
	 * @return [0] = Vertexbuffer | [1] = Texturkoordinaten
	 */
	public final FloatBuffer getMeshData()
	{
		// Die Vertex-Informationen an OpenGL uebertragen
		return mMeshBuffer;

	}

	/**
	 * Gibt die Vertexgroesse zurueck
	 * @return
	 */
	public final int getVertexSize()
	{
		return VERTEXSIZE;
	}

	/**
	 * Gibt die Texturkoordinatengroesse zurueck
	 * @return
	 */
	public final int getTexCoordSize()
	{
		return TEXCOORDSIZE;
	}

	/**
	 * Gibt die groesse eines Datenblocks 
	 * (Texturkoordinaten und Vertexgroesse) zurueck
	 * @return
	 */
	public final int getBlockSize()
	{
		return BLOCKSIZE;
	}

	/**
	 * Gibt die Buffer ID fuer die Meshdaten / Modelldaten zurueck
	 * @return
	 */
	public final int getBufferID()
	{
		return mBufferID;
	}

	/**
	 * Bindet die Meshdaten an das OpenGL System und loescht Sie lokal
	 * @param _bufferID
	 */
	public void setBufferID(int _bufferID)
	{
		mBufferID = _bufferID;

		// Den Buffer leeren, er nimmt sonst nur Speicherplatz weg
		mMeshBuffer.limit(0);
		mMeshBuffer = null;
	}

	/**
	 * Gibt die Anzahl der zu zeichnenden Vertices zurueck
	 * @return
	 */
	public final int getVertexCount()
	{
		return VERTEXCOUNT;
	}
	
	/**
	 * Gibt die ID dieses items zurueck
	 * @return
	 */
	public final int getID()
	{
		return mID;
	}
	
	/**
	 * Liefert das gesuchte Objekt in einer Itemliste
	 * @param _items Itemliste
	 * @param _id gesuchte Objekt-ID
	 * @return Objektname oder Meldung, dass nichts gefunden wurde
	 */
	public static String getItem(InterfaceItem[] _items, int _id)
	{
		for(int counter = 0; counter < _items.length; counter++)
		{
			if(_items[counter].getID() == _id)
			{
				return _items[counter].getName();
			}
		}
		return "Item nicht gefunden";
	}

}
